<?php

namespace app\common\controller;

use app\api\controller\ApiNotify;
use think\facade\Env;
use think\facade\Request;
use Yansongda\Pay\Pay;

/**
 * 抖音支付
 */
class BytePay
{
  protected $instance = NULL;
  protected $config = [];
  /**
   * 初始化方法
   */
  public  function __construct()
  {
    // 获取当前域名
    $domain = Request::domain();
    // 获取当前协议（http或https）
    $scheme = Request::scheme();
    // 获取当前端口
    $port = Request::port();
    // 如果是非标准端口（80或443），则需要加上端口号
    if ($scheme == 'http' && $port != 80 || $scheme == 'https' && $port != 443) {
      $domain .= ':' . $port;
    }

    $this->config = [
      'douyin' => [
        'default' => [
          // 选填-商户号
          // 抖音开放平台 --> 应用详情 --> 支付信息 --> 产品管理 --> 商户号
          'mch_id' => Env::get('BYTE.PAY_MCHID'),
          // 必填-支付 Token，用于支付回调签名
          // 抖音开放平台 --> 应用详情 --> 支付信息 --> 支付设置 --> Token(令牌)
          'mch_secret_token' => Env::get('BYTE.PAY_MCH_SECRET_TOKEN'),
          // 必填-支付 SALT，用于支付签名
          // 抖音开放平台 --> 应用详情 --> 支付信息 --> 支付设置 --> SALT
          'mch_secret_salt' => Env::get('BYTE.PAY_MCH_SECRET_SALT'),
          // 必填-小程序 app_id
          // 抖音开放平台 --> 应用详情 --> 支付信息 --> 支付设置 --> 小程序appid
          'mini_app_id' => Env::get('BYTE.BYTE_APPID'),
          // 选填-抖音开放平台服务商id
        //   'thirdparty_id' => '',
          // 选填-抖音支付回调地址
          'notify_url' => $domain . '/api/ApiNotify/bytePayNotify',
        ],
      ],
      'logger' => [ // optional
        'enable' => false,
        'file' => $domain . '/paylog/bytepay.log',
        'level' => 'info', // 建议生产环境等级调整为 info，开发环境为 debug
        'type' => 'single', // optional, 可选 daily.
        'max_file' => 30, // optional, 当 type 为 daily 时有效，默认 30 天
      ],
      'http' => [ // optional
        'timeout' => 5.0,
        'connect_timeout' => 5.0,
        // 更多配置项请参考 [Guzzle](https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html)
      ],
    ];
  }

  //退款
  public function orderRefund($order_no, $refund_money)
  {
    Pay::config($this->config);
    $refund_money = intval(round($refund_money * 100));
    $result = Pay::douyin()->refund([
      'out_order_no' => $order_no,
      'refund_amount' => $refund_money,
      'refund_reason' => '用户退款',
    ]);
    return $result;
  }


  public function miniProPay($money, $order_no, $openid = '')
  {   
    Pay::config($this->config); 
    $money = intval(round($money * 100));
    $result = Pay::douyin()->mini([
      'out_order_no' => $order_no,
      'total_amount' => $money,
      'subject' => '订单支付',
      'body' => '订单支付',
      'valid_time' => 600,
      // 'expand_order_info' => json_encode([
      //   'original_delivery_fee' => 15,
      //   'actual_delivery_fee' => 10
      // ])
    ]); 
    return $result;
  }

  public function callback()
  {
    Pay::config($this->config);

    try {
      $data = Pay::douyin()->callback(); // 是的，验签就这么简单！
      $data = json_decode($data, true);
      $apiNotify = new ApiNotify();
      
      $data_msg = json_decode($data['msg'], true);
      $out_trade_no = $data_msg['cp_orderno'];
      $transaction_id = $data_msg['channel_no']; 
     
      $payRst = $apiNotify->doNotify($out_trade_no, $transaction_id, $data_msg);
      if ($payRst) {
        return Pay::douyin()->success();
      }
    } catch (\Throwable $e) {
        // file_put_contents('ddd.dd', $e);
      dd($e);
    }
  }
}
